home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / spiders.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  4KB  |  147 lines

  1. /***************************************************************************
  2.  
  3.   vidhrdw.c
  4.  
  5.   Functions to emulate the video hardware of the machine.
  6.  
  7. ***************************************************************************/
  8.  
  9. #include "driver.h"
  10. #include "vidhrdw/generic.h"
  11. #include "vidhrdw/crtc6845.h"
  12.  
  13. extern int spiders_video_flip;
  14.  
  15. static int bitflip[256];
  16. static int *screenbuffer;
  17.  
  18. #define SCREENBUFFER_SIZE    0x2000
  19. #define SCREENBUFFER_MASK    0x1fff
  20.  
  21. /***************************************************************************
  22.  
  23.   Start the video hardware emulation.
  24.  
  25. ***************************************************************************/
  26. int spiders_vh_start(void)
  27. {
  28.     int loop;
  29.  
  30.     if ((tmpbitmap = osd_create_bitmap(Machine->drv->screen_width,Machine->drv->screen_height)) == 0) return 1;
  31.  
  32.     for(loop=0;loop<256;loop++)
  33.     {
  34.         bitflip[loop]=(loop&0x01)?0x80:0x00;
  35.         bitflip[loop]|=(loop&0x02)?0x40:0x00;
  36.         bitflip[loop]|=(loop&0x04)?0x20:0x00;
  37.         bitflip[loop]|=(loop&0x08)?0x10:0x00;
  38.         bitflip[loop]|=(loop&0x10)?0x08:0x00;
  39.         bitflip[loop]|=(loop&0x20)?0x04:0x00;
  40.         bitflip[loop]|=(loop&0x40)?0x02:0x00;
  41.         bitflip[loop]|=(loop&0x80)?0x01:0x00;
  42.     }
  43.  
  44.     if ((screenbuffer = malloc(SCREENBUFFER_SIZE*sizeof(int))) == 0) return 1;
  45.     memset(screenbuffer,1,SCREENBUFFER_SIZE*sizeof(int));
  46.  
  47.     return 0;
  48. }
  49.  
  50.  
  51. /***************************************************************************
  52.  
  53.   Stop the video hardware emulation.
  54.  
  55. ***************************************************************************/
  56. void spiders_vh_stop(void)
  57. {
  58.     osd_free_bitmap(tmpbitmap);
  59.     free(screenbuffer);
  60. }
  61.  
  62.  
  63. /***************************************************************************
  64.  
  65.   Draw the game screen in the given osd_bitmap.
  66.   Do NOT call osd_update_display() from this function, it will be called by
  67.   the main emulation engine.
  68.  
  69. ***************************************************************************/
  70. void spiders_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  71. {
  72.     int loop,data0,data1,data2,col;
  73.  
  74.     size_t crtc6845_mem_size;
  75.     int video_addr,increment;
  76.  
  77.     unsigned char *RAM = memory_region(REGION_CPU1);
  78.  
  79.  
  80.     crtc6845_mem_size=crtc6845_horiz_disp*crtc6845_vert_disp*8;
  81.  
  82.     if(spiders_video_flip)
  83.     {
  84.         video_addr=crtc6845_start_addr+(crtc6845_mem_size-1);
  85.         if((video_addr&0xff)==0x80) video_addr-=0x80;    /* Fudge factor!!! */
  86.         increment=-1;
  87.     }
  88.     else
  89.     {
  90.         video_addr=crtc6845_start_addr;
  91.         increment=1;
  92.     }
  93.  
  94.     video_addr&=0xfbff;    /* Fudge factor: sometimes this bit gets set and */
  95.                 /* I've no idea how it maps to the hardware but  */
  96.                 /* everything works OK if we do this             */
  97.  
  98.     if(crtc6845_page_flip) video_addr+=0x2000;
  99.  
  100.     for(loop=0;loop<crtc6845_mem_size;loop++)
  101.     {
  102.         int i,x,y,combo;
  103.  
  104.         if(spiders_video_flip)
  105.         {
  106.             data0=bitflip[RAM[0x0000+video_addr]];
  107.             data1=bitflip[RAM[0x4000+video_addr]];
  108.             data2=bitflip[RAM[0x8000+video_addr]];
  109.         }
  110.         else
  111.         {
  112.             data0=RAM[0x0000+video_addr];
  113.             data1=RAM[0x4000+video_addr];
  114.             data2=RAM[0x8000+video_addr];
  115.         }
  116.  
  117.         combo=data0|(data1<<8)|(data2<<16);
  118.  
  119.         if(screenbuffer[video_addr&SCREENBUFFER_MASK]!=combo)
  120.         {
  121.  
  122.             y=loop/0x20;
  123.  
  124.             for(i=0;i<8;i++)
  125.             {
  126.                 x=((loop%0x20)<<3)+i;
  127.                 col=((data2&0x01)<<2)+((data1&0x01)<<1)+(data0&0x01);
  128.  
  129.                 plot_pixel2(bitmap, tmpbitmap, x, y, Machine->pens[col]);
  130.  
  131.                 data0 >>= 1;
  132.                 data1 >>= 1;
  133.                 data2 >>= 1;
  134.             }
  135.             screenbuffer[video_addr&SCREENBUFFER_MASK]=combo;
  136.         }
  137.         video_addr+=increment;
  138.         video_addr&=0x3fff;
  139.     }
  140.  
  141.     if (full_refresh)
  142.     {
  143.         /* Now copy the temp bitmap to the screen */
  144.         copybitmap(bitmap,tmpbitmap,0,0,0,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  145.     }
  146. }
  147.